home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / os2 / e33el2.zip / emacs / 19.33 / lisp / talk.el < prev    next >
Lisp/Scheme  |  1996-01-20  |  4KB  |  102 lines

  1. ;;; talk.el --- Allow several users to talk to each other through Emacs.
  2.  
  3. ;; Copyright (C) 1995 Free Software Foundation, Inc.
  4.  
  5. ;; Keywords: comm, frames
  6.  
  7. ;; This file is part of GNU Emacs.
  8.  
  9. ;; GNU Emacs is free software; you can redistribute it and/or modify
  10. ;; it under the terms of the GNU General Public License as published by
  11. ;; the Free Software Foundation; either version 2, or (at your option)
  12. ;; any later version.
  13.  
  14. ;; GNU Emacs is distributed in the hope that it will be useful,
  15. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ;; GNU General Public License for more details.
  18.  
  19. ;; You should have received a copy of the GNU General Public License
  20. ;; along with GNU Emacs; see the file COPYING.  If not, write to the
  21. ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  22. ;; Boston, MA 02111-1307, USA.
  23.  
  24. ;;; Commentary:
  25.  
  26. ;; This is a multi-user talk package that runs in Emacs.
  27. ;; Use talk-connect to bring a new person into the conversation.
  28.  
  29. ;;; Code:
  30.  
  31. (defvar talk-display-alist nil
  32.   "Alist of displays on which Emacs talk is now running.
  33. Each element has the form (DISPLAY FRAME BUFFER).")
  34.  
  35. ;;;###autoload
  36. (defun talk-connect (display)
  37.   "Connect to display DISPLAY for the Emacs talk group."
  38.   (interactive "sTalk to display: ")
  39.   ;; Make sure we have an entry for the current display.
  40.   (let ((mydisp (cdr (assq 'display (frame-parameters (selected-frame))))))
  41.     (talk-add-display mydisp))
  42.   ;; Make sure we have an entry for the specified display.
  43.   (talk-add-display display)
  44.   ;; Add the new buffers to all talk frames.
  45.   (talk-update-buffers))
  46.  
  47. (defun talk-add-display (display)
  48.   (let* ((elt (assoc display talk-display-alist))
  49.      (name (concat "*talk-" display "*"))
  50.      buffer frame)
  51.     (if (not (and elt (frame-live-p (setq frame (nth 1 elt)))))
  52.     (setq frame (make-frame-on-display display (list (cons 'name name)))))
  53.     (if (not (and elt (buffer-name (get-buffer (setq buffer (nth 2 elt))))))
  54.     (setq buffer (get-buffer-create name)))
  55.     (setq talk-display-alist
  56.       (cons (list display frame buffer) (delq elt talk-display-alist)))))
  57.  
  58. (defun talk-disconnect ()
  59.   "Disconnect this display from the Emacs talk group."
  60.   (interactive)
  61.   (let* ((mydisp (cdr (assq 'display (frame-parameters (selected-frame)))))
  62.      (elt (assoc mydisp talk-display-alist)))
  63.     (delete-frame (nth 1 elt))
  64.     (kill-buffer (nth 2 elt))
  65.     (setq talk-display-alist (delq elt talk-display-alist))
  66.     (talk-update-buffers)))
  67.  
  68. (defun talk-update-buffers ()
  69.   "Update all the talk frames so that each shows all the talk buffers."
  70.   (let ((tail talk-display-alist))
  71.     (while tail
  72.       (let ((frame (nth 1 (car tail)))
  73.         (this-buffer (nth 2 (car tail)))
  74.         (buffers
  75.          (mapcar (function (lambda (elt) (nth 2 elt)))
  76.              talk-display-alist)))
  77.     ;; Put this display's own talk buffer
  78.     ;; at the front of the list.
  79.     (setq buffers (cons this-buffer (delq this-buffer buffers)))
  80.     (talk-split-up-frame frame buffers))
  81.       (setq tail (cdr tail)))))
  82.  
  83. (defun talk-split-up-frame (frame buffers)
  84.   "Split FRAME into equal-sized windows displaying the buffers in BUFFERS.
  85. Select the first of these windows, displaying the first of the buffers."
  86.   (let ((lines-per-buffer (/ (frame-height frame) (length buffers)))
  87.     (old-frame (selected-frame)))
  88.     (unwind-protect
  89.     (progn
  90.       (select-frame frame)
  91.       (select-window (frame-first-window frame))
  92.       (delete-other-windows)
  93.       (while (progn
  94.            (switch-to-buffer (car buffers))
  95.            (setq buffers (cdr buffers)))
  96.         (split-window-vertically lines-per-buffer)
  97.         (other-window 1))
  98.       (select-window (frame-first-window frame)))
  99.       (select-frame old-frame))))
  100.  
  101. ;;; talk.el ends here
  102.